#pragma once

#include <iostream>
#include <string>
#include <cstdarg>//vsnprintf 
#include <ctime>
#include <unistd.h>

#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3
#define FATAL 4

#define NUM 1024
#define LOG_NORMAL "log.txt"
#define LOG_ERR "log.error"

const char *to_levelstr(int level)
{
    switch (level)
    {
    case DEBUG:
        return "DEBUG";
    case NORMAL:
        return "NORMAL";
    case WARNING:
        return "WARNING";
    case ERROR:
        return "ERROR";
    case FATAL:
        return "FATAL";
    default:
        return nullptr;
    }
}

void logMessage(int level, const char *format, ...)
{
    char logprefix[NUM];
    snprintf(logprefix, sizeof(logprefix), "[%s][%ld][pid: %d]",
             to_levelstr(level), (long int)time(nullptr), getpid());

    char logcontent[NUM];
    va_list arg;//va_list其实就是char*类型的指针
    va_start(arg, format);//把指针指向可变参数的第一个，这几个宏是为了提取可变参数
    //va_arg(arg,int);//让这个指针移向指定类型的大小
    //va_end(arg);//让这个指针置空

    //vsnprintf 根据可变参数列表指针arg，按照特定的格式format将其提取进logcontent这片空间中
    vsnprintf(logcontent,sizeof(logcontent),format,arg);

    std::cout<<logprefix<<logcontent<<std::endl;

}

/*
void logMessage(int level,const std::string &message)
{
    //暂定
    //std::cout<<message<<std::endl;

    // [日志等级] [时间戳/时间] [pid] [messge]

}
*/
